#ifndef COMMAND_H
#define COMMAND_H
#include "common_head.h"
#include "pool_head.h"


/** 
 * @brief 处理 remove 命令
 * 
 *
*/
void handler_remove(int client_fd, data *msg, char *work_path, char *user_name, MYSQL *mysql);

/**
 * @brief 处理 ls 命令
 *
 * @param work_path 整个工作目录
 */
void handler_ls(char *user_name, data *msg, int net_fd, MYSQL *mysql);

/**
 * @brief 处理 cd 命令
 *
 */

int handler_cd(int sockfd, data msg, char *work_path, char *name, MYSQL *mysql, char *fixed_path);

/**
 * @brief 发送文件给客户端
 *
 * @param work_path 服务器工作目录
 * @param file_name 需要下载的文件名
 * @param net_fd 与客户端链接的文件描述符
 * @return int
 */

//参数1：文件描述符
//参数2：command，args结构体
//参数3：工作路径
//参数4：mysql指针
//参数5：用户名
//puts同理
int handler_gets(int sockfd, data msg, char *file_path, MYSQL *mysql, char *name);

int handler_puts(int sockfd, data msg, char *name, MYSQL *mysql);

void handler_mkdir(char *user_name, data *msg, int net_fd, MYSQL *mysql);

/**
 * @brief 处理登录的逻辑
 *
 * @param client_fd 与客户端交互的文件描述符
 * @param msg 传输的数据
 * @param work_path 服务端的工作路径
 * @param mysql 数据库连接
 * @param username 用户名
 * @param newpath 用于cd命令的路径
 */
void handler_login(int client_fd, data msg,char *work_path,MYSQL *mysql,char *username,char *newpath);

/**
 * @brief 处理注册的逻辑
 *
 * @param client_fd 与客户连接的文件描述符
 * @param msg 
 * @param work_path
 * @param mysql
 */
void handler_sigup(int client_fd, data msg,char *work_path,MYSQL *mysql,char *username);

/**
 * @brief 获取盐值和经过加盐后的 hash 密码
 * @param password 明文密码
 * @param hashed_password 接收哈希密码的变量
 * @param salt 盐值 16 进制位
 * @param salt_hex 生成盐值
 */
void generate_hash_with_salt(const char *password, char **hashed_password,
                             unsigned char **salt, char *salt_hex);

/**
 * @brief 往日志中打印具体执行的 sql 语句
 *
 * @param level 日志等级
 * @param user_name 用户名
 * @param sql sql 语句
 */
void print_sql_to_log(const char *level, const char *user_name,
                      const char *sql);

/**
 * @brief 从配置文件中获取指定参数的值。
 *
 * 该函数通过读取配置文件 `config.ini`，寻找与给定键 `key`
 * 相匹配的项，并将相应的值复制到 `value` 指向的缓冲区中。
 *
 * @param key 要查找的键。
 * @param value 用于存储找到的键的值的缓冲区。
 * @return 成功找到并复制值返回 0，否则返回 - 1。
 */
int get_parameter(char *key, char *value);

/**
 * 计算文件的SHA-256哈希值
 *
 * @param filename 文件名
 * @param hash 输出哈希值字符串的指针
 */
void compute_sha256_hash(const char *filename, char **hash);

#endif